﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Ext.Net;
using System.Collections.Generic;
using Sio.Mdm.Client;
using Sio.Mdm.BF.Sifranti;
using Sio.Mdm.Entities;
using Sio.Mdm.Types.Database;
using Sio.Mdm.BF.Administracija;
using Sio.Mdm.BF.Idm;

namespace Sio.Mdm.Web.Organizacija
{
	public partial class Content : Controls.Page
	{
		private void LoadTabs()
		{
			//TabNavigation.Urls.Add("UceciSeznam.aspx");
			//TabNavigation.Urls.Add("StarsiSeznam.aspx");
		}

		protected override void OnLoad(EventArgs e)
		{
			var filter = (from f in new Filter<SolskoLeto>() where f.Naziv.StartsWith("A") select f);
			filter = FilterMethods.Skip<SolskoLeto>(filter, 10);
			filter.ToString();

			base.OnLoad(e);
		}


		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack && !X.IsAjaxRequest)
			{
				this.AddUceci.RenderTo = "mainForm";//ni ok
				var slService = ServiceFactory.GetService<ISolskaLetaService>();

				//naredim prazen collection
				EntityCollection<SolskoLeto> leta = new EntityCollection<SolskoLeto>(
					new Filter<SolskoLeto>().Where(r => r.LetoId != null).OrderBy(r => r.KonecLeta));

				this.StoreSolskaLeta.DataSource = leta;
				this.StoreSolskaLeta.DataBind();

				int izbranoLeto = -1;
				if (ComboLeta.SelectedItem.Value != "")
					izbranoLeto = Convert.ToInt16(ComboLeta.SelectedItem.Value);

				this.BuildClassTree(treeClass.Root, izbranoLeto);
				this.BuildParentsTree(treeStarsi.Root, izbranoLeto);
                this.BuildGroupTree(treeSkupine.Root);
            }
		}
		public Ext.Net.TreeNodeCollection BuildClassTree(Ext.Net.TreeNodeCollection nodes, int izbranoLeto)
		{
			if (nodes == null)
			{
				nodes = new Ext.Net.TreeNodeCollection();
			}

			Ext.Net.TreeNode root = new Ext.Net.TreeNode();
			root.Text = "Root";
			nodes.Add(root);

			//preberemo razrede iz baze
            var filter = from p in new Filter<RazredSkupinaUceci>()
                         join r in new Filter<RazredSkupina>() on p.RazredId equals r.RazredId
                         where p.LetoId == izbranoLeto
                         where r.OrganizacijaId == this.UserSession.Organizacija
                         orderby r.Razred
                         orderby r.Paralelka
                         select p;

			EntityCollection<RazredSkupinaUceci> sortirano = new EntityCollection<RazredSkupinaUceci>(filter);
				//new Filter<RazredSkupinaUceci>().Join<RazredSkupina>(g,h => h.RazredId == g.RazredId).Where(r => r.LetoId == izbranoLeto).OrderBy(r => r.Razred).OrderBy(r => r.Paralelka));

			int xRazred = 0;
			var razredNode = new Ext.Net.TreeNode();
			foreach (var razred in sortirano)
			{
				if (xRazred != razred.Razred)
				{
					xRazred = razred.Razred;
					razredNode = new Ext.Net.TreeNode();
					razredNode.Text = String.Format("{0}. razred ({1}) ", razred.Razred, razred.SteviloUcecihRazred.ToString());
					razredNode.Expanded = false;
					razredNode.Listeners.Click.Handler = String.Format("addTabUceci('letoid={0}&razred={1}', '{2}. razred');", razred.LetoId, razred.Razred, razred.Razred);
					root.Nodes.Add(razredNode);
				}
				Ext.Net.TreeNode paralelka = new Ext.Net.TreeNode();
				paralelka.Text = razred.Oznaka + " (" + razred.SteviloUcecihParalelka.ToString() + ")";
				paralelka.Listeners.Click.Handler = String.Format("addTabUceci('letoid={0}&razredid={1}', '{2}');", razred.LetoId, razred.RazredId, razred.Oznaka);
				razredNode.Nodes.Add(paralelka);
			}

			return nodes;
		}
		public Ext.Net.TreeNodeCollection BuildParentsTree(Ext.Net.TreeNodeCollection nodes, int izbranoLeto)
		{
			if (nodes == null)
			{
				nodes = new Ext.Net.TreeNodeCollection();
			}

			Ext.Net.TreeNode root = new Ext.Net.TreeNode();
			root.Text = "Root";
			nodes.Add(root);

			//preberemo razrede iz baze
			EntityCollection<RazredSkupinaStarsi> sortirano = new EntityCollection<RazredSkupinaStarsi>(
				new Filter<RazredSkupinaStarsi>().Where(r => r.LetoId == izbranoLeto).OrderBy(r => r.Razred).OrderBy(r => r.Paralelka));

			int xRazred = 0;
			var razredNode = new Ext.Net.TreeNode();
			foreach (var razred in sortirano)
			{
				if (xRazred != razred.Razred)
				{
					xRazred = razred.Razred;
					razredNode = new Ext.Net.TreeNode();
					razredNode.Text = String.Format("{0}. razred ({1}) ", razred.Razred, razred.SteviloStarsevRazred.ToString());
					razredNode.Expanded = false;
					razredNode.Listeners.Click.Handler = String.Format("addTabStarsi('letoid={0}&razred={1}', '{2}. razred');", razred.LetoId, razred.Razred, razred.Razred);
					root.Nodes.Add(razredNode);
				}
				Ext.Net.TreeNode paralelka = new Ext.Net.TreeNode();
				paralelka.Text = razred.Oznaka + " (" + razred.SteviloStarsevParalelka.ToString() + ")";
				paralelka.Listeners.Click.Handler = String.Format("addTabStarsi('letoid={0}&razredid={1}', '{2}');", razred.LetoId, razred.RazredId, razred.Oznaka);
				razredNode.Nodes.Add(paralelka);
			}

			return nodes;
		}





        private void ShowClientError(string title, string message)
        {
            X.Msg.Show(new MessageBoxConfig
            {
                Title = title,
                Message = message,
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR
            });
        }


        #region Skupine

        private void FillGroup(Ext.Net.TreeNode node, int? SkupinaID, int globina)
        {
            if (globina > 10)
                return;

            EntityCollection<Skupina> sortirano = new EntityCollection<Skupina>(
              new Filter<Skupina>().Where(r =>
                  //(r.OrganizacijaID == this.UserSession.OrganizacijaId) && //zaenkrat odstranjeno ker so težave pri branju UserSession.OrganizacijaId
                   (r.SkupinaParentId == SkupinaID) &&
                   (r.SkupinaId != SkupinaID)
                   ).OrderBy(r => r.Naziv));

            foreach (var skupina in sortirano)
            {
                Ext.Net.TreeNode child = new Ext.Net.TreeNode();
                child.Text = skupina.Naziv;
                child.NodeID = skupina.SkupinaId.ToString();
                //child.Listeners.Click.Handler = String.Format("addTabSkupina('skupinaid={0}', '{1}');", skupina.SkupinaId, skupina.Naziv);
                node.Nodes.Add(child);
                FillGroup(child, skupina.SkupinaId, globina + 1);
            }
        }

        public Ext.Net.TreeNodeCollection BuildGroupTree(Ext.Net.TreeNodeCollection nodes)
        {
            if (nodes == null)
            {
                nodes = new Ext.Net.TreeNodeCollection();
            }

            Ext.Net.TreeNode root = new Ext.Net.TreeNode();
            root.Text = "Root"; //skriti node
            nodes.Add(root);

            FillGroup(root, null, 0);
            return nodes;
        }

        protected void RenameGroup(object sender, RemoteRenameEventArgs e)
        {
            var skupina = new EntityCollection<Skupina>(new Filter<Skupina>().Where(r => r.SkupinaId == int.Parse(e.NodeID)));
            if (skupina.Count() == 1)
            {
                skupina[0].Naziv = e.NewText;
                skupina.Update();
                e.Accept = true;
            }
            else
            {
                e.Accept = false;
                e.RefusalMessage = "Napaka pri določitvi skupine";
            }
        }

        protected void RemoveGroup(object sender, RemoteActionEventArgs e)
        {
            e.Accept = false;
            e.RefusalMessage = "Odstranjevanje skupin (še) ni podprto";
            ShowClientError("Napaka", e.RefusalMessage);
        }

        protected void AppendGroup(object sender, RemoteAppendEventArgs e)
        {
            Skupina skupina = EntityFactory.CreateInstance<Skupina>();

            skupina.Naziv = e.Text;
            int parent;
            if (int.TryParse(e.ParentNodeID, out parent))
                skupina.SkupinaParentId = parent;
            skupina.OrganizacijaID = UserSession.Organizacija;

            var slService = ServiceFactory.GetService<ISkupineService>();
            slService.Create(skupina, this.UserSession);

            //e.Listeners.Click.Handler = String.Format("addTabSkupina('skupinaid={0}', '{1}');", skupina.SkupinaId, skupina.Naziv);
            e.NodeID = skupina.SkupinaId.ToString();
            e.Accept = true;
        }

        protected void MoveGroup(object sender, RemoteMoveEventArgs e)
        {
            var skupina = new EntityCollection<Skupina>(new Filter<Skupina>().Where(r => r.SkupinaId == int.Parse(e.NodeID)));
            if (skupina.Count() == 1)
            {
                int parent;
                if (int.TryParse(e.TargetNodeID, out parent))
                    skupina[0].SkupinaParentId = parent;
                else
                    skupina[0].SkupinaParentId = null;
                skupina.Update();
                e.Accept = true;
            }
        }

        [DirectMethod]
        public string RefreshSkupineMenu()
        {
            var nodes = BuildGroupTree(null);
            return nodes.ToJson();
        }

        #endregion

        [DirectMethod]
		public string RefreshUceciMenu()
		{
			int izbranoLeto = -1;
			if (ComboLeta.SelectedItem.Value != "")
				izbranoLeto = Convert.ToInt16(ComboLeta.SelectedItem.Value);

			Ext.Net.TreeNodeCollection nodes = this.BuildClassTree(null, izbranoLeto);

			return nodes.ToJson();
		}



		[DirectMethod]
		public string RefreshStarsiMenu()
		{
			int izbranoLeto = -1;
			if (ComboLeta.SelectedItem.Value != "")
				izbranoLeto = Convert.ToInt16(ComboLeta.SelectedItem.Value);

			Ext.Net.TreeNodeCollection nodes = this.BuildParentsTree(null, izbranoLeto);

			return nodes.ToJson();
		}
		[DirectMethod]
		public void NeizbraniZavihek()
		{
			X.Msg.Show(new MessageBoxConfig
			{
				Title = "Napačna izbira",
				Message = "Najprej izberite v meniju eno od področij administracije",
				Buttons = MessageBox.Button.OK,
				Icon = MessageBox.Icon.ERROR
			});
		}



	}
}
